﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using PSE.AuditLogging.LogEntry;
using System.Security.Cryptography;
using PSE.AuditLogging.Common.Exception;

namespace PSE.AuditLogging.Client
{
    /// <summary>
    /// Classe que empacota os dados que serão logados gerando uma assinatura única para os dados, possibilitando 
    /// identificar alterações realizadas no tráfego do pacote pelos componentes 
    /// </summary>
    internal class LogEntryPacker
    {
        private static byte[] hashComplement = { 10, 14, 23, 56, 1, 0, 99, 14 };

        /// <summary>
        /// Empacotar uma entra de log assinando o seu conteúdo para garantir a autenticidade da informação
        /// </summary>
        /// <param name="entry"></param>
        /// <returns></returns>
        internal static LogEntryPackage Pack(BaseLogEntry entry)
        {
            try
            {
                #region Validações do parametro de entrada
                if (entry == null)
                    throw new ArgumentNullException("entry");
                #endregion

                #region Serialização e Assinatura dos dados
                PSE.Framework.Serialization.BinarySerializer ser = new PSE.Framework.Serialization.BinarySerializer();
                SHA384Managed hasher = new SHA384Managed();
                
                byte[] body = ser.Serialize(entry);
                byte[] hashData = new byte[body.Length + hashComplement.Length];
                
                body.CopyTo(hashData, 0);
                hashComplement.CopyTo(hashData, body.Length);
                byte[] bSign = hasher.ComputeHash(hashData);

                #endregion

                return new LogEntryPackage(entry, Convert.ToBase64String(bSign));
            }
            catch (Exception ex)
            {
                throw new LogEntryPackException("Error packing log entry, see inner exception for more details.", ex);
            }
        }
    }
}
